package cn.itcast.web.session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

/*
* Session细节:
* 1.当客户端关闭后，服务器不关闭，两次获取session是否为同一个？
* 默认情况下，不是的。客户端关闭也表示会话结束了，再访问时是没有对应的cookie头的。这时候
  会重新创建一session并在响应消息体中设置cookie头为该session的ID(即它的地址哈希值).

 2.实现客户端关闭后，服务器端获取的session仍是同一个:
    归根到底就是关闭客户端导致cookie数据被销毁，因此，我们可以在获取session对象后，创建一个cookie
    对象来存放session对象的id并设置cookie的存活周期，这样在cookie存活周期中，不管客户端关闭多少次
    每一次访问资源2时都可以获取到同一个session对象。即利用cookie会话共享session地址数据
    //1.获取Session对象
    HttpSession session=request.getSession();
    System.out.println(session);//每次访问该资源都查看获取的session地址是否一致。
    //2.实现关闭客户端后，服务器端获取的session仍是同一个:
    Cookie cookie=new Cookie("JSESSIONID",session.getId());   //给cookie绑定session地址值
    cookie.setMaxAge(60);  //持久化存储cookie一分钟
    response.addCookie(cookie);   //将cookie发送到客户端

 演示:第一次访问该资源查看控制台输出的session地址，然后重启浏览器后再访问该资源查看获取session
      地址和第一次获取的是否一致:
*/
@WebServlet("/sessionservletDemo3")
public class SessionServletDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //1.获取session(即由request内置对象调用api获取一个Session对象来存放数据)
        HttpSession session=request.getSession();
        //2.输出session对象的地址
        System.out.println(session);
        //3.创建cookie对象，绑定所获取的session的地址
        Cookie cookie=new Cookie("JSESSIONID",session.getId());
        //4.持久化存储cookie一分钟
        cookie.setMaxAge(60);
        //5.将cookie返回到客户端
        response.addCookie(cookie);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }
}
